home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr46 / vfwdk.zip / VFWSDK.ZIP / SAMPLES / BRAVADO / FLAT.ASM < prev    next >
Assembly Source File  |  1993-01-31  |  5KB  |  152 lines

  1.         TITLE FLAT.ASM
  2.         page 60,132
  3.  
  4. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  5. ;
  6. ; FLAT.ASM - Returns a selector to the frame buffer memory
  7. ;
  8. ; (C) Copyright Microsoft Corp. 1992-1993.  All rights reserved.
  9. ;
  10. ; You have a royalty-free right to use, modify, reproduce and 
  11. ; distribute the Sample Files (and/or any modified version) in 
  12. ; any way you find useful, provided that you agree that 
  13. ; Microsoft has no warranty obligations or liability for any 
  14. ; Sample Application Files which are modified. 
  15. ;
  16. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  17.  
  18. ?PLM=1        ; PASCAL Calling convention is DEFAULT
  19. ?WIN=0      ; Windows calling convention
  20.  
  21.         .286
  22.         .xlist
  23.         include cmacros.inc
  24.         include vcap.inc
  25.         .list
  26.  
  27.         externFP    AllocSelector           ; in KERNEL
  28.         externFP    FreeSelector            ; in KERNEL
  29.         externFP    SetSelectorBase         ; in KERNEL
  30.         externFP    SetSelectorLimit        ; in KERNEL
  31.  
  32. public CreatePhysicalSelector
  33.  
  34. ; -------------------------------------------------------
  35. ;               DATA SEGMENT DECLARATIONS
  36. ; -------------------------------------------------------
  37.  
  38. ifndef SEGNAME
  39.         SEGNAME equ <_TEXT>
  40. endif
  41.  
  42. createSeg %SEGNAME, CodeSeg, word, public, CODE
  43.  
  44. sBegin Data
  45.         GlobalD         glpFrameBuffer, 0
  46. sEnd Data
  47.  
  48. sBegin CodeSeg
  49.         assumes cs,CodeSeg
  50.         assumes ds,Data
  51.         assumes es,nothing
  52.  
  53. ;----------------------------------------------------------------
  54. ;
  55. ;   returns DX:AX       --> selector:offset to video buffer
  56. ;
  57. ;----------------------------------------------------------------
  58.         assumes ds,Data
  59.         assumes es,nothing
  60.  
  61. cProc CreatePhysicalSelector,<FAR,PASCAL,PUBLIC>,<si,di>
  62.         ParmD   base
  63.         ParmD   limit
  64. cBegin
  65.         mov     cx,base.lo      ; BX:CX = physical base of memory
  66.         mov     bx,base.hi
  67.  
  68.         mov     di,limit.lo     ; SI:DI = extent of memory
  69.         mov     si,limit.hi
  70.  
  71.         mov     ax,0800h        ; call DPMI
  72.         int     31h
  73.         jnc     dpmi_no_error
  74.  
  75. dpmi_error:
  76.         xor     si,si
  77.         jmp     exit
  78.  
  79. dpmi_no_error:                  ; BX:CX contains linear base
  80.         mov     di,cx           ; save it in SI:DI
  81.         mov     si,bx
  82.  
  83.         ;
  84.         ;   now create a selector that points to the memory
  85.         ;
  86.         cCall   AllocSelector, <ds>
  87.         xchg    si,ax               ; si = selector, ax = base.hi
  88.  
  89.         cCall   SetSelectorBase,<si, ax, di>
  90.  
  91.         ;we should be able to use the following, but for some
  92.         ;reason, Kernel limits size to only 1 Meg.
  93.         ;Therefore, call DPMI directly to set the size!!!
  94.         ;cCall   SetSelectorLimit,<si, limit>  ; doesn't work > 1 Meg.
  95.  
  96.         mov     ax,0008h        ; call SetSegmentLimit
  97.         mov     bx,si           ; selector in bx
  98.         mov     cx,limit.hi     ; CX:DX = physical extent of memory
  99.         mov     dx,limit.lo
  100.         int     31h
  101. exit:
  102.         mov     dx,si           ; DX:AX points to memory
  103.         xor     ax,ax
  104. cEnd
  105.  
  106.  
  107. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  108. ; GetFrameBufferPointer     Gets a linear pointer to frame memory.
  109. ;
  110. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  111.  
  112. cProc GetFrameBufferPointer,<FAR,PASCAL,PUBLIC,WIN>,<si,di>
  113.         ParmB        bAddress        ; bAddress is (1-14)
  114. cBegin
  115.     ; Get a selector to display memory
  116.     xor    ax, ax
  117.     xor    bx, bx
  118.     mov    bl, bAddress
  119.     mov    cl, 04h
  120.     shl    bx, cl
  121.     mov    cx, 0010h
  122.         ; (1 Meg - 1) (must change following for larger buffer sizes)
  123.     cCall    CreatePhysicalSelector,<bx,ax,000Fh,0FFFFh>
  124.         mov     glpFrameBuffer.sel, dx
  125.         mov     glpFrameBuffer.off, ax  
  126. cEnd
  127.  
  128. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  129. ; FreeFrameBufferSelector
  130. ;
  131. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  132.  
  133. cProc FreeFrameBufferSelector,<FAR,PASCAL,PUBLIC,WIN>,<si,di>
  134. cBegin
  135.         ; Free the selector after setting its length to zero.
  136.         mov     ax, glpFrameBuffer.sel
  137.         or      ax,ax
  138.         jz      NoSelector
  139.         mov     bx, ax          ; BX is the selector
  140.         mov     ax,0008h        ; call SetSegmentLimit
  141.         xor     cx,cx           ; CX:DX = physical extent of memory
  142.         xor     dx,dx
  143.         int     31h
  144.  
  145.         cCall   FreeSelector, <bx>
  146. NoSelector:
  147.         xor     ax,ax
  148. cEnd
  149.  
  150. sEnd
  151. end
  152.